package per.cy.common.factory;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.json.JSONUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;

import java.util.Map;

/**
 * @author cy
 * date 2024/9/4
 */
public class JsonToEntityFactory {

    private static final Log log = LogFactory.get();

    private JsonToEntityFactory() {
    }

    /**
     * 将 JSON 字符串转换为指定类型的对象，并根据提供的字段映射关系进行属性复制。
     *
     * @param str   JSON 字符串
     * @param clazz 目标对象类型
     * @param map   字段映射关系
     * @param <T>   泛型类型
     * @return 转换后的对象
     */
    public static <T> T convertFromJson(String str, Class<T> clazz, Map<String, String> map) {
        try {
            // 解析 JSON 字符串
            Object obj = JSONUtil.parseObj(str);

            // 创建目标对象实例
            T result = clazz.getDeclaredConstructor().newInstance();

            // 根据字段映射关系复制属性
            BeanUtil.copyProperties(obj, result, CopyOptions.create().setFieldMapping(map));

            return result;
        } catch (Exception e) {
            // 处理解析或属性复制过程中的异常
            log.error("Failed to convert JSON to entity: {} , {}", str, e.getMessage(), e);
            return null;
        }
    }
}
